/* 
 * File:   main.c
 * Author: Tomás R. González Barroso  
 * Diseño de sistemas Operativos
 * Created on 25 de junio de 2013, 22:55
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>

#include "buffer_cache.h"

//Señales
int sigreceived = 0;
sigset_t sigset;
int pid;

/*
//Manejadores de interrupciones
void sign_hadler_sigusr2 (void) {
   sigreceived = SIGUSR2;        
   printf("Señal SIGUSR2 recibida.\n");
   basyncwrite();        
}
*/


//Manejador de interrupciones
void sig_handler(int signo)   
{   
        switch(signo) {   
                case SIGUSR1:   
                        sigreceived = SIGUSR1;        
                        printf("Señal SIGUSR1 recibida.\n"); 
                        break;   
                case SIGUSR2:   
                        sigreceived = SIGUSR2;        
                        printf("Señal SIGUSR2 recibida.\n");
                        basyncwrite(); 
                        //sigreceived = 0;
                        break;                   
        }   
}   

//Inicializamos señales
void bsignal_init(void) {
    struct sigaction act;    
    
    pid = getpid();    
    signal(SIGUSR1, sig_handler);
    signal(SIGUSR2, sig_handler);
    /*
    act.sa_handler= sign_hadler_sigusr2;    
    //sigfillset(&act.sa_mask);
    sigemptyset(&act.sa_mask);
    act.sa_flags= 0;
    //sigaction(SIGUSR1, &act, NULL);  
    sigaction(SIGUSR2, &act, 0);  
    //msigfillset(&sigset); 
    //sigdelset(&sigset, SIGUSR2);
    //sigdelset(&sigset, SIGUSR1);  
     */
}
/*
//Inicializamos señales
void bsignal_init(void) {
    struct sigaction action;   
    sigset_t sigmask;   
    
    pid = getpid();   
    sigemptyset(&sigmask);   
    sigaddset(&sigmask, SIGUSR1);   
    sigaddset(&sigmask, SIGUSR2);   
    memset(&action, 0, sizeof(action));   
    action.sa_handler = sig_handler;   
    action.sa_mask = sigmask;   
    sigaction(SIGUSR1, &action, NULL);   
    sigaction(SIGUSR2, &action, NULL);   
    sigfillset(&sigmask);   
    sigdelset(&sigmask, SIGUSR1);   
    sigdelset(&sigmask, SIGUSR2);   
}*/

int main(int argc, char* argv[]) {
    char* arg="-i";
    int i = 1;
    
    //Inicializamos handler señales
    bsignal_init();
    //Comprobamos nº minimo de parametros
    if (argc < 2) {
        printf("Nº de parámetros incorrecto.\n");
        printf("Modo de empleo: buffer-cache [PARÁMETROS]\n");
        printf("PARÁMETROS:\n");
        printf(" -h: Modo host. Inicializa memoria compartida. \n");
        printf(" -i: Modo interactivo.\n");
        printf("TECLAS EN EJECUCION:\n");        
        printf("'b': Muestra por pantalla el buffer indicado.\n");        
        printf("'c': Llamada a la funcion close.\n");
        printf("'f': Llamada a brelse del buffer indicado.\n");  
        printf("'g': Llamada a getblk.\n");
        printf("'o': Llamada a la función open.\n");
        printf("'q': Finaliza ejecución.\n");
        printf("'l': Llamada a la función lseek.\n");
        printf("'m': Muestra por pantalla el buffer_cache.\n");
        printf("'r': Llamada a read.\n");
        printf("'t': Visualiza la tabla de ficheros.\n");
        printf("'u': Visualiza la tabla local de ficheros abiertos TDFU.\n");
        printf("'w': Llamada a write.\n");  
    }
    else {
        if (argc == 2) {
            arg = argv[i];   
            int getmemory = FALSE;
            printf("Parametro: %s\n",arg);
            if (strcmp(arg, "-h") == 0)
              getmemory = TRUE;    
            bc_init(getmemory,0);
        }
        else {
            char src[255],dst[255];
            int getmemory = FALSE;
            int tam = 0;
            int num = 0;
            strcpy(src,argv[1]);
            printf("fuente:%s\n",src);    
            strcpy(dst,argv[2]);
            printf("destino:%s\n",dst); 
            tam = atoi(argv[3]);
            printf("bytes:%d\n",tam);  
            
            bc_init(getmemory,1);
            printf("open('%s',O_RDWR)\n",src);
            int fd1=s_open(src,O_RDONLY); 
            printf("open('%s',O_CREAT | O_WRONLY)\n",dst);
            int fd2=s_open(dst,O_WRONLY | O_CREAT);
            char data[tam];                      
            printf("read(%d,data,%d)\n",fd1,tam);           
            num = s_read(fd1,data,tam);
            while (num > 0) {
               printf("Read:%d)\n",num);       
               s_write(fd2,data,num);
               num = s_read(fd1,data,tam);              
            }                             
            s_close(fd1);
            s_close(fd2);
            bc_init(getmemory,2);
            
        }
    }
    return (EXIT_SUCCESS);
}

